package com.stone.redis.lock.infra.lock.test;

import com.stone.redis.lock.domain.bo.LockInfo;
import com.stone.redis.lock.infra.lock.impl.ReentrantRedisLock;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * 清除订单操作，模拟下单场景中，如果一个用户下单后超过xxx时间还没有支付，则会将该用户所下的订单清除
 * 并且将预减库存退回去。这里使用定时任务去定期扫描过期的订单
 *
 * @author Mr_wenpan@163.com 2021/07/23 23:11
 */
@Slf4j
@Component
public class ClearOrderTask {

    @Autowired
    private ReentrantRedisLock reentrantRedisLock;

    /**
     * 定时任务，定时执行该方法
     *
     * @return void
     * @author Mr_wenpan@163.com 2021/7/23 11:16 下午
     */
    // @Scheduled(cron = "0/1 * * ? * *")
    public void clearOrderTask() throws InterruptedException {
        clearOrder();
    }

//    @Scheduled(cron = "0/10 * * ? * *")
    public void clearOrderTask2() throws InterruptedException {
        LockInfo lockInfo = LockInfo.builder().name("test-lock").leaseTime(100).build();
        reentrantRedisLock.setLockInfo(lockInfo);
        boolean isLock = reentrantRedisLock.tryLock();

        if (!isLock) {
            log.error("获取锁失败了，定时任务执行结束.....");
            return;
        }
        try {
            // 获取到锁，开始执行作废订单恢复预减库存操作
            log.info("获取锁成功，开始作废订单，恢复预减库存.....");
            clearOrder();
        } finally {
            log.warn("作废订单，恢复预减库存完毕，开始释放锁......");
            reentrantRedisLock.unlock();
        }

    }

    public void clearOrder() throws InterruptedException {
        log.info("捞取到时间过期订单数据，开始作废订单......");
        TimeUnit.SECONDS.sleep(2);
        log.info("订单作废完毕，开始恢复预减库存.......");
    }
}
